
<!DOCTYPE html>
<html>
  <head>
    
<meta charset="utf-8" >

<title>Socket编程中send函数引发线程退出 | Blog</title>
<meta name="description" content="个人生活，学习记录">

<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/animate.css/3.7.0/animate.min.css">

<link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.7.2/css/all.css" integrity="sha384-fnmOCqbTlWIlj8LyTjo7mOUStjsKC4pOpQbqyi7RrhN7udi9RwhKkMHpvLbHG9Sr" crossorigin="anonymous">
<link rel="shortcut icon" href="https://qiaoxu123.github.io/favicon.ico?v=1589072669553">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/KaTeX/0.10.0/katex.min.css">
<link rel="stylesheet" href="https://qiaoxu123.github.io/styles/main.css">



<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
<script src="https://cdn.bootcss.com/highlight.js/9.12.0/highlight.min.js"></script>



  </head>
  <body>
    <div id="app" class="main">
      <div class="site-header-container">
  <div class="site-header">
    <div class="left">
      <a href="https://qiaoxu123.github.io">
        <img class="avatar" src="https://qiaoxu123.github.io/images/avatar.png?v=1589072669553" alt="" width="32px" height="32px">
      </a>
      <a href="https://qiaoxu123.github.io">
        <h1 class="site-title">Blog</h1>
      </a>
    </div>
    <div class="right">
      <transition name="fade">
        <i class="icon" :class="{ 'icon-close-outline': menuVisible, 'icon-menu-outline': !menuVisible }" @click="menuVisible = !menuVisible"></i>
      </transition>
    </div>
  </div>
</div>

<transition name="fade">
  <div class="menu-container" style="display: none;" v-show="menuVisible">
    <div class="menu-list">
      
        
          <a href="https://qiaoxu123.github.io" class="menu purple-link">
            首页
          </a>
        
      
        
          <a href="https://qiaoxu123.github.io/archives" class="menu purple-link">
            归档
          </a>
        
      
        
          <a href="https://qiaoxu123.github.io/tags" class="menu purple-link">
            标签
          </a>
        
      
    </div>
  </div>
</transition>


      <div class="content-container">
        <div class="post-detail">
          
          <h2 class="post-title">Socket编程中send函数引发线程退出</h2>
          <div class="post-info post-detail-info">
            <span><i class="icon-calendar-outline"></i> 2019-09-02</span>
            
              <span>
                <i class="icon-pricetags-outline"></i>
                
                  <a href="https://qiaoxu123.github.io/tag/5HMxWRPZ1/">
                    工程调试
                    
                  </a>
                
              </span>
            
          </div>
          <div class="post-content">
            <p>在调试过程中烦恼已久的问题，终于找到了，在这转载记录下。</p>
<!-- more -->
<blockquote>
<p><a href="https://blog.csdn.net/boshuzhang/article/details/88408062">参考博客</a></p>
</blockquote>
<p>Socket编程中，几乎是不可避免地会用到多线程，最简单的情况是分别建立两个线程实现收发。而作为服务器端，当客户端断开后，服务器端应继续保持监听状态等待连接。个人在调试过程中，当客户端断开后，服务器端立刻断开，调试好久也没有发现问题。现在终于找到了。进入主题。</p>
<p>在多线程编程中其中一个使用一个线程来accept要连接的客户端，在接受client的请求之后新建一个线程来进行具体的操作。其操作包括想client端发送一定字节的数据，使用send()函数来进行操作。但在发送过程中出现任何一个client端的断线，则整个程序都会退出。</p>
<pre><code>ssize_t send(int sockfd, const void *buff, size_t nbytes, int flags);
</code></pre>
<p>上面为send函数原型，在通常的使用中<code>flags</code>参数一般设置为0，此时如果客户端断开，继续往里写数据的话，会引发一个信号<code>SIGPIPE</code>，此信号会引发线程的退出。</p>
<p>解决的方法：1. 可以将<code>flags</code>参数设置为<code>MSG_NOSIGNAL</code>；2. 设置<code>SIG_IGN</code>信号处理函数。</p>
<p><a href="http://www.ideawu.net/blog/archives/413.html">参考文档</a></p>
<hr>
<p>在这我简单地将flags设置为MSG_NOSIGNAL即可解决。</p>

          </div>
        </div>

        
          <div class="next-post">
            <a class="purple-link" href="https://qiaoxu123.github.io/post/baidu-apollo-share/">
              <h3 class="post-title">
                下一篇：Apollo轨迹规划分享--问答
              </h3>
            </a>
          </div>
          
      </div>

      

      <div class="site-footer">
  <div class="slogan">个人生活，学习记录</div>
  <div class="social-container">
    
      
    
      
    
      
    
      
    
      
    
  </div>
  Powered by <a href="https://github.com/getgridea/gridea" target="_blank">Gridea</a> | <a class="rss" href="https://qiaoxu123.github.io/atom.xml" target="_blank">RSS</a>
</div>


    </div>
    <script type="application/javascript">

hljs.initHighlightingOnLoad()

var app = new Vue({
  el: '#app',
  data: {
    menuVisible: false,
  },
})

</script>




  </body>
</html>
